﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Lists;
using ReportTemplates;
using DevExpress.XtraReports.UI;
using CustomSecurity;
using GeneralLibs;

namespace ClinicManagement.Print
{
    public partial class PrintClinic
    {
        //In phiếu chỉ định. phân chia theo phòng ban
        public bool PrintPhieuChiDinh(Guid phieuChiDinhID, bool kiemPhieuThu)
        {
            DataSet ds = new DataSet();
            try
            {
                SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = new SqlDataAdapter(cmd);

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "Select_ChiTietKhoanMucPhieuChiDinh";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@PhieuChiDinhID", phieuChiDinhID);
                da.Fill(ds, "ChiTietPhieuChiDinh");

                //Lọc lấy distinct ra các phòng ban tương ứng với dịch vụ
                List<string> phongBans = new List<string>();
                foreach (DataRow row in ds.Tables["ChiTietPhieuChiDinh"].Rows)
                {
                    if (!phongBans.Contains(row["TenPhongBan"].ToString()))
                        phongBans.Add(row["TenPhongBan"].ToString());
                }

                //Lọc các dòng có phòng ban tương ứng và in phiếu chỉ định --> Có n phòng ban thì sẽ ra n phiếu

                foreach (string item in phongBans)
                {
                    DataView dv = ds.Tables["ChiTietPhieuChiDinh"].DefaultView;
                    dv.RowFilter = string.Format("TenPhongBan = '{0}'", item);

                    PrintPhieuChiDinhTheoPhongBan(phieuChiDinhID, dv.ToTable(), kiemPhieuThu);
                }

                con.Close();

                return true;
            }
            catch (Exception ex)
            {
                return true;
            }
        }
        public bool PrintPhieuChiDinhTheoPhongBan(Guid phieuChiDinhID, DataTable ChiTietPhieuChiDinhTheoPhongBan, bool kiemPhieuThu)
        {
            DataSet ds = new ReportTemplates.Clinic.DsClinicChung();
            try
            {
                SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = null; ;

                cmd.CommandText = "Select_ThongTinDoanhNghiep2";
                cmd.CommandType = CommandType.StoredProcedure;
                da = new SqlDataAdapter(cmd);
                da.Fill(ds, "ThongTinDoanhNghiep");

                ds.Tables["ChiTietPhieuChiDinh"].Merge(ChiTietPhieuChiDinhTheoPhongBan);

                cmd.CommandText = string.Format("SELECT C.Ma SoPhieuCD, C.Ngay, C.TienGiaLe TongTienGiaLe, C.PhanTramChietKhau, C.TienChietKhau TongTienChietKhau, C.TienThanhToan TongTienThanhToan, \n" +
                                                "		BN.Ma MaBenhNhan, BN.Ten TenBenhNhan, BN.GioiTinh, BN.Tuoi, BN.SoCMND, C.SoTheBHYT, BN.DiaChi,  \n" +
                                                "		F.FullName BacSi, G.Ten PhongBan, C.TinhTrangBenh, H.FullName NguoiTaoPhieu \n" +
                                                "FROM   Clinic_Phieu C INNER JOIN Clinic_BenhNhan BN ON BN.ID = C.BenhNhanID \n" +
                                                "		INNER JOIN [User] F ON C.BacSiID = F.ID \n" +
                                                "		INNER JOIN DoiTuongNghiepVu G ON C.PhongBanID = G.ID \n" +
                                                "		LEFT JOIN [User] H ON C.ThuNganID = H.ID \n" +
                                                "WHERE C.ID = '{0}' \n",
                                                phieuChiDinhID);
                cmd.Parameters.Clear();
                cmd.CommandType = CommandType.Text;
                da.Fill(ds, "Master_PhieuChiDinh");

                con.Close();

                //Đọc tiền
                object soTienObject = ds.Tables["ChiTietPhieuChiDinh"].Compute("Sum(ThanhTien)", "");
                Int64 soTien = 0;
                try
                {
                    soTien = Convert.ToInt64(soTienObject);
                }
                catch (Exception ex)
                { }
                ds.Tables["Master_PhieuChiDinh"].Rows[0]["DocTien"] = GeneralLibs.CommonLib.DocTien(soTien, "VNĐ");

                //TÍnh tiền chiết khấu theo phòng ban, từ tiền giá lẻ và tiền thanh toán của chi tiết
                try
                {
                    object soTienGiaBanObject = ds.Tables["ChiTietPhieuChiDinh"].Compute("Sum(GiaBan)", "");
                    Int64 soTienGiaBan = 0;
                    soTienGiaBan = Convert.ToInt64(soTienGiaBanObject);

                    ds.Tables["Master_PhieuChiDinh"].Rows[0]["TongTienChietKhau"] = Convert.ToDecimal(soTienGiaBan - soTien);
                }
                catch (Exception ex)
                { }

                //Chèn logo nếu có
                if (DanhMucLogo.GetFirst() != null && DanhMucLogo.GetFirst().AnhLogo != null)
                {
                    ds.Tables["Logo"].Rows.Add(DanhMucLogo.GetFirst().AnhLogo);
                }

                DevExpress.XtraReports.UI.XtraReport xtraReport = new ReportTemplates.Clinic.PhieuChiDinh.XtraReportPhieuChiDinh();

                if (kiemPhieuThu)
                {
                    ds.Tables["Master_PhieuChiDinh"].Rows[0]["Title"] = "PHIẾU CHỈ ĐỊNH KIÊM THU TIỀN";
                }
                else
                {
                    ds.Tables["Master_PhieuChiDinh"].Rows[0]["Title"] = "PHIẾU CHỈ ĐỊNH";
                }

                xtraReport.DataSource = ds;
                ReportPrintTool printTool = new ReportPrintTool(xtraReport);
                printTool.ShowPreview();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        //In đơn thuốc
        public bool PrintDonThuocDangBill(Guid hoSoKhamBenhID)
        {
            DataSet ds = new ReportTemplates.Clinic.DsClinicChung();
            try
            {
                SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = new SqlDataAdapter(cmd);

                cmd.CommandText = "Select_ThongTinDoanhNghiep2";
                cmd.CommandType = CommandType.StoredProcedure;
                da = new SqlDataAdapter(cmd);
                da.Fill(ds, "ThongTinDoanhNghiep");

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "Select_KhoanMucDonThuoc";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@HoSoKhamBenhID", hoSoKhamBenhID);
                da.Fill(ds, "KhoanMuc_DonThuoc");

                cmd.CommandText = "Select_Master_DonThuoc";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@HoSoKhamBenhID", hoSoKhamBenhID);
                da.Fill(ds, "Master_DonThuoc");

                con.Close();

                //Chèn logo nếu có
                if (DanhMucLogo.GetFirst() != null && DanhMucLogo.GetFirst().AnhLogo != null)
                {
                    ds.Tables["Logo"].Rows.Add(DanhMucLogo.GetFirst().AnhLogo);
                }

                ReportTemplates.Clinic.DonThuoc.XtraReportDonThuocDangBill xtraReport = new ReportTemplates.Clinic.DonThuoc.XtraReportDonThuocDangBill();
                xtraReport.DataSource = ds;
                xtraReport.PrintingSystem.ShowMarginsWarning = false;
                ReportPrintTool printTool = new ReportPrintTool(xtraReport);
                printTool.ShowPreview();
                return true;
            }
            catch (Exception ex)
            {
                return true;
            }
        }

        //In bảng kê thu tiền khám bệnh để làm thuế
        public bool PrintBangKeThue(DataTable dtAll, DateTime ngay)
        {
            DataSet ds = new DataSet();
            try
            {
                SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = new SqlDataAdapter(cmd);

                ////Cắt table gốc thành các table con theo yêu cầu KCB
                //dtAll.AcceptChanges();  //Để có row nào bị đánh dấu là delete thì k bị lỗi
                //List<DataTable> lstTable = SplitTable(dtAll, 10);

                //int sttBangKe = 1;
                //foreach (DataTable dt in lstTable)
                //{
                //    //Tách lấy mã số bảng kê dựa vào số table lấy ra được
                //    string maBangKe = "";
                //    maBangKe = CommonLib.FormatSoTheoDoDai(sttBangKe.ToString(), 3);

                //    ExportToExcel.AddSTT(dt);

                //    PrintBangKeThue(dt, maBangKe);

                //    sttBangKe++;
                //}

                //Kiểu mới KCB đòi cắt thành 2, trên 200k và dưới 200k thôi
                dtAll.AcceptChanges();  //Để có row nào bị đánh dấu là delete thì k bị lỗi
                List<DataTable> lstTable = SplitTableByValue(dtAll, 200000);

                int sttBangKe = 1;
                foreach (DataTable dt in lstTable)
                {
                    //Tách lấy mã số bảng kê dựa vào số table lấy ra được
                    string maBangKe = "";
                    maBangKe = CommonLib.FormatSoTheoDoDai(sttBangKe.ToString(), 3);

                    ExportToExcel.AddSTT(dt, false);

                    PrintBangKeThue(dt, ngay, maBangKe);

                    sttBangKe++;
                }

                con.Close();

                return true;
            }
            catch (Exception ex)
            {
                return true;
            }
        }
        public bool PrintBangKeThue(DataTable ChiTiet, DateTime ngay, string maBangKe)
        {
            DataSet ds = new ReportTemplates.Clinic.DsClinicChung();
            try
            {
                SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = null; ;

                cmd.CommandText = "Select_ThongTinDoanhNghiep2";
                cmd.CommandType = CommandType.StoredProcedure;
                da = new SqlDataAdapter(cmd);
                da.Fill(ds, "ThongTinDoanhNghiep");

                ds.Tables["KhoanMuc_BangKeThue"].Merge(ChiTiet);

                DataRow rowMaster = ds.Tables["Master_BangKeThue"].NewRow();
                rowMaster["Ngay"] = ngay;
                rowMaster["So"] = maBangKe;
                rowMaster["NguoiLapPhieu"] = User.CurUser.FullName;
                ds.Tables["Master_BangKeThue"].Rows.Add(rowMaster);

                con.Close();

                //Chèn logo nếu có
                if (DanhMucLogo.GetFirst() != null && DanhMucLogo.GetFirst().AnhLogo != null)
                {
                    ds.Tables["Logo"].Rows.Add(DanhMucLogo.GetFirst().AnhLogo);
                }

                ReportTemplates.Clinic.XtraReportBangKeThue xtraReport = new ReportTemplates.Clinic.XtraReportBangKeThue();
                xtraReport.DataSource = ds;
                xtraReport.PrintingSystem.ShowMarginsWarning = false;
                ReportPrintTool printTool = new ReportPrintTool(xtraReport);
                printTool.ShowPreview();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        //Cắt 1 datatable to thành các datatable nhỏ hơn
        private static List<DataTable> SplitTable(DataTable originalTable, int batchSize)
        {
            List<DataTable> tables = new List<DataTable>();
            int i = 0;
            int j = 1;
            DataTable newDt = originalTable.Clone();
            newDt.TableName = "Table_" + j;
            newDt.Clear();
            foreach (DataRow row in originalTable.Rows)
            {
                DataRow newRow = newDt.NewRow();
                newRow.ItemArray = row.ItemArray;
                newDt.Rows.Add(newRow);
                i++;
                if (i == batchSize)
                {
                    tables.Add(newDt);
                    j++;
                    newDt = originalTable.Clone();
                    newDt.TableName = "Table_" + j;
                    newDt.Clear();
                    i = 0;
                }
            }

            //Vòng lặp trên sẽ sót lại newDt cuối cùng. cần thêm lệnh add nốt vào. Dấu hiệu là có Rows.Count < số dòng cần cắt
            if (newDt.Rows.Count < batchSize)
                tables.Add(newDt);

            return tables;
        }
        //Cắt table làm đôi 1 bảng >= nguongGiaTri , 1 bảng < nguongGiaTri
        private static List<DataTable> SplitTableByValue(DataTable originalTable, int nguongGiaTri)
        {
            List<DataTable> tables = new List<DataTable>();
            DataTable newDt1 = new DataTable();
            DataTable newDt2 = new DataTable();
            newDt1.TableName = "Table_1";
            newDt1.Clear();
            newDt2.TableName = "Table_2";
            newDt2.Clear();
            string condition1 = string.Format("TienThanhToan >= {0}", nguongGiaTri);
            string condition2 = string.Format("TienThanhToan < {0}", nguongGiaTri);

            originalTable.DefaultView.RowFilter = condition1;
            newDt1 = originalTable.DefaultView.ToTable();

            originalTable.DefaultView.RowFilter = condition2;
            newDt2 = originalTable.DefaultView.ToTable();

            tables.Add(newDt1);
            tables.Add(newDt2);

            return tables;
        }

        public bool PrintChungTuPhieuThuClinic_CoBHYT(Guid clinic_PhieuID)
        {
            DataSet ds = new ReportTemplates.QuanLyQuy.PhieuThu.DsPhieuThu();
            try
            {
                SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
                SqlCommand cmd = con.CreateCommand();
                SqlDataAdapter da = null; ;

                cmd.CommandText = "Select_ThongTinDoanhNghiep2";
                cmd.CommandType = CommandType.StoredProcedure;
                da = new SqlDataAdapter(cmd);
                da.Fill(ds, "ThongTinDoanhNghiep");


                cmd.CommandText = "Select_ChiTietPhieuThu_Clinic_CoBHYT";
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("@Clinic_PhieuID", clinic_PhieuID);

                //Đẩy vào 2 table vì các thông tin cũ vẫn lấy ở table cũ cho tiện
                da.Fill(ds, "ChiTietPhieuThu_Clinic");
                con.Close();

                //Chèn logo nếu có
                if (DanhMucLogo.GetFirst() != null && DanhMucLogo.GetFirst().AnhLogo != null)
                {
                    ds.Tables["Logo"].Rows.Add(DanhMucLogo.GetFirst().AnhLogo);
                }

                ReportTemplates.QuanLyQuy.PhieuThu.RptPhieuThuClinic_CoBHYT report = new ReportTemplates.QuanLyQuy.PhieuThu.RptPhieuThuClinic_CoBHYT();
                report.SetDataSource(ds);
                ReportTemplates.FrmPrintReport frm = new ReportTemplates.FrmPrintReport(report, "Phiếu đăng kí khám cho bệnh nhân BHYT");
                frm.Show();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }
}
